<h2 id="访问更多域名">访问更多域名</h2>
<p>如果你是从 github 直接下载的 release，exe 同级目录下应该提供了 <code>DragTheDomainConfigFileHere.bat</code>。</p>
<p>这会使用一个我自用的配置文件，也就是同目录下的 <code>DOMAINconfig.txt</code>。这样可以访问更多网站，注意其对子域名敏感（子域名需要单独配置）。</p>
<p>对于该文件 <code>DOMAINconfig.txt</code> 的编辑，请往下翻。</p>
<h2 id="命令行参数帮助">命令行参数帮助</h2>
<p>鉴于本应用名字较长，我强烈建议您把他的名字改短一点，比如 <code>zlib.exe</code>。</p>
<p>默认接下来您已经进行了重命名。</p>
<h3 id=""><code>-h</code></h3>
<p>打开帮助，也就是显示此文件。</p>
<h3 id="-"><code>-g url</code></h3>
<p>打开后跳转到 url，而不是默认开始页。<br />
注意：<code>url</code> 必须带协议头，如：<code>https://1919810.com</code>。</p>
<h3 id="--"><code>-c [FILE]</code></h3>
<p>使用命令行配置文件。</p>
<p>如果有 <code>[FILE]</code>，程序读取 <code>FILE</code>，否则程序会尝试读取同一目录下的 <code>CMDconfig.txt</code>。</p>
<p>该文件包含命令行。（通常用于开发人员）</p>
<pre><code class="language-text">--host-resolver-rules=&quot;MAP zh.z-library.re [2606:4700:3033::ac43:aa46]:443,MAP bu2021.xyz [2606:4700:3033::6815:3e2]:443&quot; -origin-to-force-quic-on=zh.z-library.se:443,bu2021.xyz:443
</code></pre>
<h3 id="---"><code>-d</code></h3>
<p>根据域名进行配置，要求 IP 支持 QUIC，且能访问（一般指 ping 得通）（<strong>必须支持 QUIC</strong>）。</p>
<p>如果有 <code>[FILE]</code>，程序读取 <code>FILE</code>，否则程序会尝试读取同一目录下的 <code>DOMAINconfig.txt</code>。</p>
<p>我们通过空行来分割多个 IP 的配置，每份配置的第一行是该 IP（支持 IPv6），接下来若干行是你的域名（不包含协议头，如 <code>https://</code>）。<strong>注意，该方法对域名极其敏感，子域名是不一样的域名。如 <code>www.pixiv.net</code> 和 <code>pixiv.net</code> 不一样，<code>z-library.se</code> 和 <code>zh.z-library.se</code> 不一样，<em>请注意。</em></strong></p>
<p>由于 <code>-origin-to-force-quic-on</code> 不支持通配符，所以除非你理解这个程序在干什么，不建议使用类似 <code>*.114514.com</code> 之类的通配符。</p>
<p>接下来任意多行是需要启用工具的域名，尽量不要太多，Windows 命令行的长度是有限制的。（好像是<span class="language-math">8192</span>个字符）</p>
<p>这个域名有两个工具选择，QUIC 和丢弃 sni。</p>
<ul>
<li>如果是 QUIC，直接写上来。</li>
<li>如果是丢弃 sni，在行首加上 <code>^</code>。（这是因为严格上来讲丢弃 sni 是非正常做法，所以使用特殊标识）</li>
<li>如果只是修改 dns，在行首加上 <code>-</code></li>
</ul>
<p>以下是一个可行的配置：（这两个 IP 分别是 CloudFlare 的 IPv4 与 IPv6 之一，为了演示分开）。</p>
<pre><code class="language-plaintext">[2606:4700:3033::ac43:aa46]
zh.z-library.se
bu2021.xyz
annas-archive.se
longlivemarxleninmaoism.online
zlib-articles.se
zh.zlib-articles.se

114.250.70.34
-www.recaptcha.net

172.64.145.17
www.pixiv.net

116.202.120.165
^www.torproject.org
</code></pre>
<h3 id="----"><code>-o</code></h3>
<p>页面将显示打开此次程序的浏览器命令行参数。</p>
<h3 id="-----"><code>-a</code></h3>
<p>显示 Android 开启设置文本。</p>
<p>见 Android 设置帮助。</p>
<h2 id="使用自己的浏览器">使用自己的浏览器</h2>
<p>给你的浏览器（比如说 <code>chrome.exe</code>）传参打开即可。</p>
<p>比如</p>
<pre><code class="language-bash">chrome.exe --host-resolver-rules=&quot;MAP zh.z-library.re [2606:4700:3033::ac43:aa46]:443,MAP bu2021.xyz [2606:4700:3033::6815:3e2]:443&quot; -origin-to-force-quic-on=zh.z-library.se:443,bu2021.xyz:443 --host-rules=&quot;MAP libgen.rs 193.218.118.42,MAP zh.singlelogin.re 176.123.7.105,MAP singlelogin.re 176.123.7.105&quot; --ignore-certificate-errors
</code></pre>
<h2 id="安卓配置指南">安卓配置指南</h2>
<p><em><strong>本指南极其复杂，在决定踏上这条路前请三思！</strong></em></p>
<p>本教程测试于 MIUI14（国内版）。</p>
<p><strong>遇到类似不安全或病毒报警，请自行判断是否继续。</strong></p>
<p>为了省流，我不打算配图片</p>
<h3 id="第一部分-准备文件">第一部分：准备文件</h3>
<h4 id="两个安装包">两个安装包</h4>
<p>（<code>.apk</code>），提供的是两个链接，不保证可以下载。</p>
<ul>
<li><a href="https://www.downkuai.com/android/140917.html">Termux</a>（知道 F-droid 的，推荐从 Fdroid 下载；如果你用电脑进行 ADB，则不需要）</li>
<li><a href="https://www.onlinedown.net/soft/10107048.htm">KiWiBrowser</a>（建议用链接里的版本，切记不要 <code>安全下载</code>！否则后果自负）（其他基于 Chromium 的浏览器也可，比如 Chromium, Chrome, UngoogledChromium, Bromite，我之所以推荐 kiwi 是因为他支持扩展，这也是我自用的浏览器之一，且是最常用的浏览器）</li>
</ul>
<h4 id="一句命令">一句命令</h4>
<p>先关闭本软件，再点开本软件安装包同级目录下的 <code>GetAndroidADBCommandLine.bat</code>，本软件会重新打开，然后复制上面的第一行内容（以 <code>_</code> 开头）</p>
<p>你会得到类似这样的东西：</p>
<pre><code class="language-text">echo &quot;_ --host-resolver-rules=\&quot;MAP bu2021.xyz 172.64.145.17:443,MAP annas-archive.se 172.64.145.17:443\&quot; -origin-to-force-quic-on=bu2021.xyz:443,annas-archive.se:443 --host-rules=\&quot;MAP libgen.rs 193.218.118.42,MAP zh.singlelogin.re 176.123.7.105,MAP singlelogin.re 176.123.7.105\&quot; --ignore-certificate-errors&quot; &gt; chrome-command-line
</code></pre>
<h3 id="第二部分-开启ADB">第二部分：开启 ADB</h3>
<p>这里提供一个 MIUI 下利用 Termux 作为终端的例子。</p>
<h4 id="安装Termux并作准备">安装 Termux 并作准备</h4>
<p>进入 Termux 后，是一个命令行界面。</p>
<p>你可以考虑换清华源，见<a href="https://mirrors.tuna.tsinghua.edu.cn/help/termux/">镜像站官方帮助文档</a></p>
<p>依次执行以下命令：（如果遇到提问，直接 <code>Enter</code> 走默认）</p>
<pre><code class="language-bash">apt update
apt upgrade
pkg install android-tools
</code></pre>
<h4 id="连接ADB">连接 ADB</h4>
<p>其他系统（UI）请自行搜索或探索办法。</p>
<p>请务必连上 WIFI（其实不重要，但是 MIUI 无线调试必须连 wifi 才能开启，所以这个网慢不慢不重要，其实这个操作根本不用连网）</p>
<ol>
<li>
<p>点开 <code>设置</code></p>
</li>
<li>
<p>点开 <code>我的设备</code></p>
</li>
<li>
<p>点开 <code>全部参数于信息</code></p>
</li>
<li>
<p>快速点击 <code>MIUI版本</code> 五次，会看到消息框 <code>您现在处于开发者模式！</code></p>
</li>
<li>
<p>不停点击返回回到 <code>设置</code> 根菜单</p>
</li>
<li>
<p>找到 <code>更多设置</code>，进入</p>
</li>
<li>
<p>进入 <code>开发者选项</code></p>
</li>
<li>
<p>找到 <code>无线调试</code>，进入，启用</p>
</li>
<li>
<p>与之前开启的 <code>Termux</code> 窗口分屏（小窗也可以，不能切后台，重要！）</p>
</li>
<li>
<p>点开使用配对码配对设备</p>
</li>
<li>
<p>会弹出来一个报告小窗窗，上面有 <code>WLAN配对码</code>，是 6 个数字，记下来，比如说是 <code>114514</code>；还有一个 <code>IP地址和·端口</code>（显示在报告小窗上那个），记下来，比如说是 <code>192.168.2.114:42257</code></p>
</li>
<li>
<p>进入 <code>Termux</code>，打命令并 <code>Enter</code></p>
<pre><code class="language-bash">adb pair 192.168.2.224:42257 114514
</code></pre>
<p>根据上一步得到数据自行修改）。然后应该会显示类似 <code>Pair Successfully</code> 之类的，你没看到 <code>Error</code> 或者 <code>ERR</code> 就行。</p>
</li>
<li>
<p>回到无线调试设置，你应该会看到一个已配对设备，继续。这次我们选在主窗口上的 <code>IP地址和端口</code>，记下来，比如说是 <code>192.168.2.114:42819</code>。<br />
键入并 <code>Enter</code></p>
<pre><code class="language-bash">adb connect 192.168.2.114:42819
</code></pre>
<p>应该返回 <code>Connected Successfully</code> 之类的，然后无线调试窗口的已配对设备会显示已连接，连接完成。<code>Termux</code> 不要退出。</p>
</li>
</ol>
<h4 id="设置command-line">设置 command-line</h4>
<p>上一步完成后，继续键入命令并 <code>Enter</code>（比如说在 <code>Termux</code> 里）。</p>
<pre><code class="language-bash">adb shell
cd /data/local/tmp
</code></pre>
<p>然后把你之前获取的那段命令键入并 <code>Enter</code>，比方说</p>
<pre><code class="language-bash">echo &quot;_ --host-resolver-rules=\&quot;MAP bu2021.xyz 172.64.145.17:443,MAP annas-archive.se 172.64.145.17:443\&quot; -origin-to-force-quic-on=bu2021.xyz:443,annas-archive.se:443 --host-rules=\&quot;MAP libgen.rs 193.218.118.42,MAP zh.singlelogin.re 176.123.7.105,MAP singlelogin.re 176.123.7.105\&quot; --ignore-certificate-errors&quot; &gt; chrome-command-line
</code></pre>
<p>接下来</p>
<pre><code class="language-bash">echo &quot;$(&lt;chrome-command-line)&quot;
</code></pre>
<p>会输出类似这样的内容：</p>
<pre><code class="language-text">_ --host-resolver-rules=&quot;MAP bu2021.xyz 172.64.145.17:443,MAP annas-archive.se 172.64.145.17:443&quot; -origin-to-force-quic-on=bu2021.xyz:443,annas-archive.se:443 --host-rules=&quot;MAP libgen.rs 193.218.118.42,MAP zh.singlelogin.re 176.123.7.105,MAP singlelogin.re 176.123.7.105&quot; --ignore-certificate-errors
</code></pre>
<p>OK，键入</p>
<pre><code class="language-bash">exit
adb disconnect
</code></pre>
<p>关闭无线调试，关闭开发者模式，关闭 Termux。</p>
<h3 id="第三部分-打开ChromeFlag">第三部分：打开 ChromeFlag</h3>
<p>还记得 Kiwi 吗。</p>
<p>进入，一路瞎点。</p>
<p>地址栏输入</p>
<pre><code class="language-text">chrome://flags/
</code></pre>
<p>搜索 <code>Command</code>，找到 <code>Enable command line on non-rooted devices</code>，设置为 <code>Enabled</code>。</p>
<p>退出 Kiwi，杀掉所有进程，<strong>重启手机</strong>。</p>
<h3 id="第四部分-确认设置成功">第四部分：确认设置成功</h3>
<p>重新打开 Kiwi。</p>
<p>地址栏输入</p>
<pre><code class="language-text">chrome://version/
</code></pre>
<p>确认命令行栏有 <code>_</code> 打头，如果没有，再次杀掉所有进程，重启，不断重复知道出现 <code>_</code>。</p>
<h3 id="第五部分-愉快上网">第五部分：愉快上网</h3>
<p>使用 KiWi 浏览器，键入 <code>https://zh.singlelogin.re</code></p>
<h2 id="安卓更新指南">安卓更新指南</h2>
<ol>
<li>重新连接 adb（如果你没有卸载 Termux，不用 <code>pair</code>，直接 <code>connect</code> 即可）。</li>
<li>设置 command-line。</li>
<li>退出 Kiwi，杀掉所有进程，重启手机。</li>
</ol>
<h2 id="域名添加与访问指南">域名添加与访问指南</h2>
<p>如果你发现了有一个域名无法连接，可以尝试配置。</p>
<h3 id="首先你要找到域名对应的IP">首先你要找到域名对应的 IP</h3>
<h4 id="网站查询">网站查询</h4>
<p>洁净域名 IP 查询：<a href="https://www.whois365.com/">Whois365</a>（非广告）</p>
<p>接下来，确保 ping 通这个 IP（请自行查找 ping 的方式）。</p>
<p>或者，如果你明确该域名使用了 cdn，可以尝试自选 ip。</p>
<p>以 CloudFlare 为例你可以到<a href="https://www.cloudflare-cn.com/ips/">这里</a>寻找一个 CloudFlareCDN 的 IP。并请确保 ping 得通。（一般可以）</p>
<h4 id="浏览器查询">浏览器查询</h4>
<p>由于 Whois365 有的域名查不到，也可以浏览器查。</p>
<p>先将 dns 换为 Cloudflare DoH，打开 <a href="chrome://net-internals/#dns">Chrome 内置 DNS 查询</a></p>
<p>输入，查询即可。再将得到的 IP 丢 Whois365 里查。</p>
<h3 id="明确过墙的方式">明确过墙的方式</h3>
<p>这里有两种方式：QUIC 与丢弃 SNI。</p>
<p>一一尝试。</p>
<h3 id="访问域名">访问域名</h3>
<p>注意，当你跳转的时候，对域名和协议极其敏感。</p>
<p><strong>注意子域名<sup class="footnotes-ref" id="footnotes-ref-1"><a href="#footnotes-def-1">1</a></sup>​也要。</strong></p>
<p><strong>如果还不行，那一般就是不行。</strong></p>
<blockquote>
<p>我这里收集了上述特殊情况：</p>
<ul>
<li>Pornhub 的 IP 是可以直连的，但是用 HostRules 实现的域前置使用了 IP 作为 sni，而这个 ip 在黑名单里。</li>
<li>Odysee 的账号网址 <code>odysee.tv</code> 使用了 Cloudfare CDN，无法域前置，但是手动关闭了 QUIC。</li>
<li>TorProject 的域前置实现比较魔幻，有的时候会当成 IP 直连，甚至因服务器 IP 而异。</li>
</ul>
</blockquote>
<h3 id="其他情况">其他情况</h3>
<p>如果出现 HTTP 协议，或者非标准端口，请采用 <code>CMDconfig</code>。</p>
<details>
<summary>或者自己编写命令行。请参考：Chromium NewWork Configs Codes：</summary>
<pre><code class="language-java">// from: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/network_session_configurator/common/network_switch_list.h
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file deliberately has no header guard, as it's inlined in a number of
// files.
// no-include-guard-because-multiply-included
// Disables the QUIC protocol.
NETWORK_SWITCH(kDisableQuic, &quot;disable-quic&quot;)
// Disables the HTTP/2 protocol.
NETWORK_SWITCH(kDisableHttp2, &quot;disable-http2&quot;)
// Enables Alternate-Protocol when the port is user controlled (&gt; 1024).
NETWORK_SWITCH(kEnableUserAlternateProtocolPorts,
               &quot;enable-user-controlled-alternate-protocol-ports&quot;)
// Enables the QUIC protocol.  This is a temporary testing flag.
NETWORK_SWITCH(kEnableQuic, &quot;enable-quic&quot;)
// Ignores certificate-related errors.
NETWORK_SWITCH(kIgnoreCertificateErrors, &quot;ignore-certificate-errors&quot;)
// Specifies a comma separated list of host-port pairs to force use of QUIC on.
NETWORK_SWITCH(kOriginToForceQuicOn, &quot;origin-to-force-quic-on&quot;)
// Disables known-root checks for outgoing WebTransport connections.
NETWORK_SWITCH(kWebTransportDeveloperMode, &quot;webtransport-developer-mode&quot;)
// Specifies a comma separated list of QUIC connection options to send to
// the server.
NETWORK_SWITCH(kQuicConnectionOptions, &quot;quic-connection-options&quot;)
// Specifies a comma separated list of QUIC client connection options.
NETWORK_SWITCH(kQuicClientConnectionOptions, &quot;quic-client-connection-options&quot;)
// Specifies the maximum length for a QUIC packet.
NETWORK_SWITCH(kQuicMaxPacketLength, &quot;quic-max-packet-length&quot;)
// Specifies the version of QUIC to use.
NETWORK_SWITCH(kQuicVersion, &quot;quic-version&quot;)
// Allows for forcing socket connections to http/https to use fixed ports.
NETWORK_SWITCH(kTestingFixedHttpPort, &quot;testing-fixed-http-port&quot;)
NETWORK_SWITCH(kTestingFixedHttpsPort, &quot;testing-fixed-https-port&quot;)
// Comma-separated list of rules that control how hostnames are mapped.
//
// For example:
//    &quot;MAP * 127.0.0.1&quot; --&gt; Forces all hostnames to be mapped to 127.0.0.1
//    &quot;MAP *.google.com proxy&quot; --&gt; Forces all google.com subdomains to be
//                                 resolved to &quot;proxy&quot;.
//    &quot;MAP test.com [::1]:77 --&gt; Forces &quot;test.com&quot; to resolve to IPv6 loopback.
//                               Will also force the port of the resulting
//                               socket address to be 77.
//    &quot;MAP * baz, EXCLUDE www.google.com&quot; --&gt; Remaps everything to &quot;baz&quot;,
//                                            except for &quot;www.google.com&quot;.
//
// These mappings apply to the endpoint host in a net::URLRequest (the TCP
// connect and host resolver in a direct connection, and the CONNECT in an http
// proxy connection, and the endpoint host in a SOCKS proxy connection).
//
// TODO(mmenke): Can we just remove this?  host-resolver-rules is more generally
// useful.
NETWORK_SWITCH(kHostRules, &quot;host-rules&quot;)
// Enable &quot;greasing&quot; HTTP/2 frame types, that is, sending frames of reserved
// types.  See https://tools.ietf.org/html/draft-bishop-httpbis-grease-00 for
// more detail.
NETWORK_SWITCH(kHttp2GreaseFrameType, &quot;http2-grease-frame-type&quot;)
// If request has no body, close the stream not by setting END_STREAM flag on
// the HEADERS frame, but by sending an empty DATA frame with END_STREAM
// afterwards.  Only affects HTTP/2 request streams, not proxy or bidirectional
// streams.
NETWORK_SWITCH(kHttp2EndStreamWithDataFrame, &quot;http2-end-stream-with-data-frame&quot;)
</code></pre>
</details>
<h2 id="有问题请加Github-issue-">有问题请加 Github issue。</h2>
<h2 id="版权声明">版权声明</h2>
<p>本文档除引用的 Chromium 源码外部分按照 <a href="https://www.gnu.org/licenses/fdl-1.3.html#license-text">GFDL</a> 提供。</p>
<div class="footnotes-defs-div"><hr class="footnotes-defs-hr" />
<ol class="footnotes-defs-ol"><li id="footnotes-def-1"><p>比如说，<code>www.pixiv.net</code> 和 <code>pixiv.net</code> 不一样，<code>z-library.se</code> 和 <code>zh.z-library.se</code> 不一样。 <a href="#footnotes-ref-1" class="vditor-footnotes__goto-ref">↩</a></p>
</li>
</ol></div>